Function corobka#(x1#,x2#,y1#,y2#)
	i=1
	For b.body = Each body
		If b\mass>0
		detx#=0
		dety#=0
		nx#=0
		ny#=0
		If b\ymin<=y1
			b\y=b\y+(y1-b\ymin)
			sech2=CopyMesh(b\mesh2)
			sres(b\mesh2,sech2,1,y1,0,y1)
			If CountVertices(GetSurface(sech2,1))>0
				l#=0
				ln=0
				detx#=0
				dety#=0
				For n=0 To (CountVertices(GetSurface(sech2,1))-2)
					dis#=(VertexX(GetSurface(sech2,1),n)-VertexX(GetSurface(sech2,1),n+1))*(VertexX(GetSurface(sech2,1),n)-VertexX(GetSurface(sech2,1),n+1))+(VertexY(GetSurface(sech2,1),n)-VertexY(GetSurface(sech2,1),n+1))*(VertexY(GetSurface(sech2,1),n)-VertexY(GetSurface(sech2,1),n+1))
					If dis>l
						l=dis
						ln=n
					EndIf
					detx=detx+VertexX(GetSurface(sech2,1),n)
					dety=dety+VertexY(GetSurface(sech2,1),n)
				Next
				dis#=(VertexX(GetSurface(sech2,1),CountVertices(GetSurface(sech2,1))-1)-VertexX(GetSurface(sech2,1),0))*(VertexX(GetSurface(sech2,1),CountVertices(GetSurface(sech2,1))-1)-VertexX(GetSurface(sech2,1),0))+(VertexY(GetSurface(sech2,1),CountVertices(GetSurface(sech2,1))-1)-VertexY(GetSurface(sech2,1),0))*(VertexY(GetSurface(sech2,1),CountVertices(GetSurface(sech2,1))-1)-VertexY(GetSurface(sech2,1),0))
				If dis>l
					l=dis
					ln=n
				EndIf
				detx=detx+VertexX(GetSurface(sech2,1),CountVertices(GetSurface(sech2,1))-1)
				dety=dety+VertexY(GetSurface(sech2,1),CountVertices(GetSurface(sech2,1))-1)
				detx=detx/(CountVertices(GetSurface(sech2,1)))
				dety=dety/(CountVertices(GetSurface(sech2,1)))
				l=Sqr(l)
				If ln=(CountVertices(GetSurface(sech2,1))-1)
					nx#=VertexX(GetSurface(sech2,1),ln)-VertexX(GetSurface(sech2,1),0)
					ny#=VertexY(GetSurface(sech2,1),ln)-VertexY(GetSurface(sech2,1),0)
					nx=nx/l
					ny=ny/l
					If orient(VertexX(GetSurface(sech2,1),ln),VertexY(GetSurface(sech2,1),ln),VertexX(GetSurface(sech2,1),0),VertexY(GetSurface(sech2,1),0),b\x,b\y)=True
						nx=-nx
						ny=-ny
					EndIf
				Else
					nx#=VertexX(GetSurface(sech2,1),ln)-VertexX(GetSurface(sech2,1),ln+1)
					ny#=VertexY(GetSurface(sech2,1),ln)-VertexY(GetSurface(sech2,1),ln+1)
					nx=nx/l
					ny=ny/l
					If orient(VertexX(GetSurface(sech2,1),ln),VertexY(GetSurface(sech2,1),ln),VertexX(GetSurface(sech2,1),ln+1),VertexY(GetSurface(sech2,1),ln+1),b\x,b\y)=True
						nx=-nx
						ny=-ny
					EndIf
				EndIf		
				r1x#=detx-b\x
				r1y#=dety-b\y
				vabd#=nx*(b\vx-b\w*r1y)+ny*(b\vy+b\w*r1x)
				impulse#=(-(b\mu)*vabd)
				kb.kontaktbody=New kontaktbody
				kb\n=i
				kb\nx=nx
				kb\ny=ny
				kb\impulse=impulse
				kb\l=0
				kb\rx=r1x
				kb\ry=r1y
				l#=ny
				ny=-nx
				nx=l
				vabd#=nx*(b\vx-b\w*r1y)+ny*(b\vy+b\w*r1x)
				z1#=(nx*r1x-ny*r1y)*b\i
				jj#=nx*(nx*b\antim-r1y*z1)+ny*(ny*b\antim+r1x*z1*b\i)
				impulse#=(-(1+b\e)*vabd)/jj
				If impulse>0
					kb.kontaktbody=New kontaktbody
					kb\n=i
					kb\nx=nx
					kb\ny=ny
					kb\impulse=impulse
					kb\l=0.00001
					kb\rx=r1x
					kb\ry=r1y
				EndIf
				FreeEntity sech2 
			EndIf
		ElseIf b\ymax>=y2
			b\y=b\y+(y2-b\ymax)
			sech2=CopyMesh(b\mesh2)
			sres(b\mesh2,sech2,0,y2,1,y2)
			If CountVertices(GetSurface(sech2,1))>0
				l#=0
				ln=0
				detx#=0
				dety#=0
				For n=0 To (CountVertices(GetSurface(sech2,1))-2)
					dis#=(VertexX(GetSurface(sech2,1),n)-VertexX(GetSurface(sech2,1),n+1))*(VertexX(GetSurface(sech2,1),n)-VertexX(GetSurface(sech2,1),n+1))+(VertexY(GetSurface(sech2,1),n)-VertexY(GetSurface(sech2,1),n+1))*(VertexY(GetSurface(sech2,1),n)-VertexY(GetSurface(sech2,1),n+1))
					If dis>l
						l=dis
						ln=n
					EndIf
					detx=detx+VertexX(GetSurface(sech2,1),n)
					dety=dety+VertexY(GetSurface(sech2,1),n)
				Next
				dis#=(VertexX(GetSurface(sech2,1),CountVertices(GetSurface(sech2,1))-1)-VertexX(GetSurface(sech2,1),0))*(VertexX(GetSurface(sech2,1),CountVertices(GetSurface(sech2,1))-1)-VertexX(GetSurface(sech2,1),0))+(VertexY(GetSurface(sech2,1),CountVertices(GetSurface(sech2,1))-1)-VertexY(GetSurface(sech2,1),0))*(VertexY(GetSurface(sech2,1),CountVertices(GetSurface(sech2,1))-1)-VertexY(GetSurface(sech2,1),0))
				If dis>l
					l=dis
					ln=n
				EndIf
				detx=detx+VertexX(GetSurface(sech2,1),CountVertices(GetSurface(sech2,1))-1)
				dety=dety+VertexY(GetSurface(sech2,1),CountVertices(GetSurface(sech2,1))-1)
				detx=detx/(CountVertices(GetSurface(sech2,1)))
				dety=dety/(CountVertices(GetSurface(sech2,1)))
				l=Sqr(l)
				If ln=(CountVertices(GetSurface(sech2,1))-1)
					nx#=VertexX(GetSurface(sech2,1),ln)-VertexX(GetSurface(sech2,1),0)
					ny#=VertexY(GetSurface(sech2,1),ln)-VertexY(GetSurface(sech2,1),0)
					nx=nx/l
					ny=ny/l
					If orient(VertexX(GetSurface(sech2,1),ln),VertexY(GetSurface(sech2,1),ln),VertexX(GetSurface(sech2,1),0),VertexY(GetSurface(sech2,1),0),b\x,b\y)=True
						nx=-nx
						ny=-ny
					EndIf
				Else
					nx#=VertexX(GetSurface(sech2,1),ln)-VertexX(GetSurface(sech2,1),ln+1)
					ny#=VertexY(GetSurface(sech2,1),ln)-VertexY(GetSurface(sech2,1),ln+1)
					nx=nx/l
					ny=ny/l
					If orient(VertexX(GetSurface(sech2,1),ln),VertexY(GetSurface(sech2,1),ln),VertexX(GetSurface(sech2,1),ln+1),VertexY(GetSurface(sech2,1),ln+1),b\x,b\y)=True
						nx=-nx
						ny=-ny
					EndIf
				EndIf		
				r1x#=detx-b\x
				r1y#=dety-b\y
				vabd#=nx*(b\vx-b\w*r1y)+ny*(b\vy+b\w*r1x)
				impulse#=(-(b\mu)*vabd)
				kb.kontaktbody=New kontaktbody
				kb\n=i
				kb\nx=nx
				kb\ny=ny
				kb\impulse=impulse
				kb\l=0
				kb\rx=r1x
				kb\ry=r1y
				l#=ny
				ny=-nx
				nx=l
				vabd#=nx*(b\vx-b\w*r1y)+ny*(b\vy+b\w*r1x)
				z1#=(nx*r1x-ny*r1y)*b\i
				jj#=nx*(nx*b\antim-r1y*z1)+ny*(ny*b\antim+r1x*z1*b\i)
				impulse#=(-(1+b\e)*vabd)/jj
				If impulse>0
					kb.kontaktbody=New kontaktbody
					kb\n=i
					kb\nx=nx
					kb\ny=ny
					kb\impulse=impulse
					kb\l=0.00001
					kb\rx=r1x
					kb\ry=r1y
				EndIf
				FreeEntity sech2 
			EndIf
		EndIf
		If b\xmin<=x1
			b\x=b\x+(x1-b\xmin)
			sech2=CopyMesh(b\mesh2)
			sres(b\mesh2,sech2,x1,0,x1,1)
			If CountVertices(GetSurface(sech2,1))>0
				l#=0
				ln=0
				detx#=0
				dety#=0
				For n=0 To (CountVertices(GetSurface(sech2,1))-2)
					dis#=(VertexX(GetSurface(sech2,1),n)-VertexX(GetSurface(sech2,1),n+1))*(VertexX(GetSurface(sech2,1),n)-VertexX(GetSurface(sech2,1),n+1))+(VertexY(GetSurface(sech2,1),n)-VertexY(GetSurface(sech2,1),n+1))*(VertexY(GetSurface(sech2,1),n)-VertexY(GetSurface(sech2,1),n+1))
					If dis>l
						l=dis
						ln=n
					EndIf
					detx=detx+VertexX(GetSurface(sech2,1),n)
					dety=dety+VertexY(GetSurface(sech2,1),n)
				Next
				dis#=(VertexX(GetSurface(sech2,1),CountVertices(GetSurface(sech2,1))-1)-VertexX(GetSurface(sech2,1),0))*(VertexX(GetSurface(sech2,1),CountVertices(GetSurface(sech2,1))-1)-VertexX(GetSurface(sech2,1),0))+(VertexY(GetSurface(sech2,1),CountVertices(GetSurface(sech2,1))-1)-VertexY(GetSurface(sech2,1),0))*(VertexY(GetSurface(sech2,1),CountVertices(GetSurface(sech2,1))-1)-VertexY(GetSurface(sech2,1),0))
				If dis>l
					l=dis
					ln=n
				EndIf
				detx=detx+VertexX(GetSurface(sech2,1),CountVertices(GetSurface(sech2,1))-1)
				dety=dety+VertexY(GetSurface(sech2,1),CountVertices(GetSurface(sech2,1))-1)
				detx=detx/(CountVertices(GetSurface(sech2,1)))
				dety=dety/(CountVertices(GetSurface(sech2,1)))
				l=Sqr(l)
				If ln=(CountVertices(GetSurface(sech2,1))-1)
					nx#=VertexX(GetSurface(sech2,1),ln)-VertexX(GetSurface(sech2,1),0)
					ny#=VertexY(GetSurface(sech2,1),ln)-VertexY(GetSurface(sech2,1),0)
					nx=nx/l
					ny=ny/l
					If orient(VertexX(GetSurface(sech2,1),ln),VertexY(GetSurface(sech2,1),ln),VertexX(GetSurface(sech2,1),0),VertexY(GetSurface(sech2,1),0),b\x,b\y)=True
						nx=-nx
						ny=-ny
					EndIf
				Else
					nx#=VertexX(GetSurface(sech2,1),ln)-VertexX(GetSurface(sech2,1),ln+1)
					ny#=VertexY(GetSurface(sech2,1),ln)-VertexY(GetSurface(sech2,1),ln+1)
					nx=nx/l
					ny=ny/l
					If orient(VertexX(GetSurface(sech2,1),ln),VertexY(GetSurface(sech2,1),ln),VertexX(GetSurface(sech2,1),ln+1),VertexY(GetSurface(sech2,1),ln+1),b\x,b\y)=True
						nx=-nx
						ny=-ny
					EndIf
				EndIf		
				r1x#=detx-b\x
				r1y#=dety-b\y
				vabd#=nx*(b\vx-b\w*r1y)+ny*(b\vy+b\w*r1x)
				impulse#=(-(b\mu)*vabd)
				kb.kontaktbody=New kontaktbody
				kb\n=i
				kb\nx=nx
				kb\ny=ny
				kb\impulse=impulse
				kb\l=0
				kb\rx=r1x
				kb\ry=r1y
				l#=ny
				ny=-nx
				nx=l
				vabd#=nx*(b\vx-b\w*r1y)+ny*(b\vy+b\w*r1x)
				z1#=(nx*r1x-ny*r1y)*b\i
				jj#=nx*(nx*b\antim-r1y*z1)+ny*(ny*b\antim+r1x*z1*b\i)
				impulse#=(-(1+b\e)*vabd)/jj
				If impulse>0
					kb.kontaktbody=New kontaktbody
					kb\n=i
					kb\nx=nx
					kb\ny=ny
					kb\impulse=impulse
					kb\l=0.00001
					kb\rx=r1x
					kb\ry=r1y
				EndIf
				FreeEntity sech2 
			EndIf
		ElseIf b\xmax>=x2
			b\x=b\x+(x2-b\xmax)
			sech2=CopyMesh(b\mesh2)
			sres(b\mesh2,sech2,x2,1,x2,0)
			If CountVertices(GetSurface(sech2,1))>0
				l#=0
				ln=0
				detx#=0
				dety#=0
				For n=0 To (CountVertices(GetSurface(sech2,1))-2)
					dis#=(VertexX(GetSurface(sech2,1),n)-VertexX(GetSurface(sech2,1),n+1))*(VertexX(GetSurface(sech2,1),n)-VertexX(GetSurface(sech2,1),n+1))+(VertexY(GetSurface(sech2,1),n)-VertexY(GetSurface(sech2,1),n+1))*(VertexY(GetSurface(sech2,1),n)-VertexY(GetSurface(sech2,1),n+1))
					If dis>l
						l=dis
						ln=n
					EndIf
					detx=detx+VertexX(GetSurface(sech2,1),n)
					dety=dety+VertexY(GetSurface(sech2,1),n)
				Next
				dis#=(VertexX(GetSurface(sech2,1),CountVertices(GetSurface(sech2,1))-1)-VertexX(GetSurface(sech2,1),0))*(VertexX(GetSurface(sech2,1),CountVertices(GetSurface(sech2,1))-1)-VertexX(GetSurface(sech2,1),0))+(VertexY(GetSurface(sech2,1),CountVertices(GetSurface(sech2,1))-1)-VertexY(GetSurface(sech2,1),0))*(VertexY(GetSurface(sech2,1),CountVertices(GetSurface(sech2,1))-1)-VertexY(GetSurface(sech2,1),0))
				If dis>l
					l=dis
					ln=n
				EndIf
				detx=detx+VertexX(GetSurface(sech2,1),CountVertices(GetSurface(sech2,1))-1)
				dety=dety+VertexY(GetSurface(sech2,1),CountVertices(GetSurface(sech2,1))-1)
				detx=detx/(CountVertices(GetSurface(sech2,1)))
				dety=dety/(CountVertices(GetSurface(sech2,1)))
				l=Sqr(l)
				If ln=(CountVertices(GetSurface(sech2,1))-1)
					nx#=VertexX(GetSurface(sech2,1),ln)-VertexX(GetSurface(sech2,1),0)
					ny#=VertexY(GetSurface(sech2,1),ln)-VertexY(GetSurface(sech2,1),0)
					nx=nx/l
					ny=ny/l
					If orient(VertexX(GetSurface(sech2,1),ln),VertexY(GetSurface(sech2,1),ln),VertexX(GetSurface(sech2,1),0),VertexY(GetSurface(sech2,1),0),b\x,b\y)=True
						nx=-nx
						ny=-ny
					EndIf
				Else
					nx#=VertexX(GetSurface(sech2,1),ln)-VertexX(GetSurface(sech2,1),ln+1)
					ny#=VertexY(GetSurface(sech2,1),ln)-VertexY(GetSurface(sech2,1),ln+1)
					nx=nx/l
					ny=ny/l
					If orient(VertexX(GetSurface(sech2,1),ln),VertexY(GetSurface(sech2,1),ln),VertexX(GetSurface(sech2,1),ln+1),VertexY(GetSurface(sech2,1),ln+1),b\x,b\y)=True
						nx=-nx
						ny=-ny
					EndIf
				EndIf		
				r1x#=detx-b\x
				r1y#=dety-b\y
				vabd#=nx*(b\vx-b\w*r1y)+ny*(b\vy+b\w*r1x)
				impulse#=(-(b\mu)*vabd)
				kb.kontaktbody=New kontaktbody
				kb\n=i
				kb\nx=nx
				kb\ny=ny
				kb\impulse=impulse
				kb\l=0
				kb\rx=r1x
				kb\ry=r1y
				l#=ny
				ny=-nx
				nx=l
				vabd#=nx*(b\vx-b\w*r1y)+ny*(b\vy+b\w*r1x)
				z1#=(nx*r1x-ny*r1y)*b\i
				jj#=nx*(nx*b\antim-r1y*z1)+ny*(ny*b\antim+r1x*z1*b\i)
				impulse#=(-(1+b\e)*vabd)/jj
				If impulse>0
					kb.kontaktbody=New kontaktbody
					kb\n=i
					kb\nx=nx
					kb\ny=ny
					kb\impulse=impulse
					kb\l=0.00001
					kb\rx=r1x
					kb\ry=r1y
				EndIf
				FreeEntity sech2 
			EndIf
		EndIf
		EndIf
		i=i+1
	Next
	i=1
	For c.circle = Each circle
		If c\mass>0
		detx#=0
		dety#=0
		nx#=0
		ny#=0
		nt=0
		If (c\yt-c\radius)<=y1
			c\y=c\y+y1-c\yt+c\radius
			ny=ny+1
			nt=nt+1
			dety=dety+y1
			detx=detx+c\x	
		ElseIf (c\yt+c\radius)>=y2
			c\y=c\y+y2-c\yt-c\radius
			ny=ny-1
			nt=nt+1
			dety=dety+y2
			detx=detx+c\x	
		EndIf	
		If (c\xt-c\radius)<=x1
			c\x=c\x+x1-c\xt+c\radius
			nx=nx+1
			nt=nt+1
			detx=detx+x1
			dety=dety+c\y	
		ElseIf (c\xt+c\radius)>=x2
			c\x=c\x+x2-c\xt-c\radius
			nx=nx-1
			nt=nt+1
			detx=detx+x2
			dety=dety+c\y	
		EndIf		
		If nt>0
			detx=detx/nt
			dety=dety/nt
			l#=Sqr(nx*nx+ny*ny)
			nx=nx/l
			ny=ny/l
			r1x#=detx-c\x
			r1y#=dety-c\y
			z1#=(nx*r1x-ny*r1y)*c\i
			jj#=nx*(nx*c\antim-r1y*z1)+ny*(ny*c\antim+r1x*z1*c\i)
			vabd#=nx*(c\vx-c\w*r1y)+ny*(c\vy+c\w*r1x)
			impulse#=(-(1+c\e)*vabd)/jj
			If impulse>0
				kc.kontaktcircle=New kontaktcircle
				kc\n=i
				kc\nx=nx
				kc\ny=ny
				kc\impulse=impulse
				kc\l=0.00001
				kc\rx=r1x
				kc\ry=r1y
			EndIf
			t#=ny
			ny=-nx
			nx=t
			vabd=nx*(c\vx-c\w*r1y)+ny*(c\vy+c\w*r1x)
			impulse=(-(c\mu)*vabd)
			kc.kontaktcircle=New kontaktcircle
			kc\n=i
			kc\nx=nx
			kc\ny=ny
			kc\impulse=impulse
			kc\l=0
			kc\rx=r1x
			kc\ry=r1y
		EndIf
		EndIf
		i=i+1
	Next
End Function
